window_get_pointer should return the direct child
authorAlexander Larsson <alexl@redhat.com>
Thu, 4 Jun 2009 16:45:35 +0000 (18:45 +0200)
committerAlexander Larsson <alexl@redhat.com>
Fri, 5 Jun 2009 13:18:36 +0000 (15:18 +0200)
We returned the innermost child that has the pointer, which is not right.
Only the direct child that has the pointer in it should be reported (if any).

gdk/gdkdisplay.c
gdk/gdkinternals.h
gdk/gdkwindow.c

index ae9c8f92dca1d04f5d982ed3239a3111efed4954..7ee0048b9e4c20ed31ae3ec69eb0646d46e76f3a 100644 (file)
@@ -517,17 +517,17 @@ gdk_display_real_get_window_at_pointer (GdkDisplay *display,
   if (window)
     {
       double xx, yy;
-      
+
       window = _gdk_window_find_descendant_at (window,
-                                              x, y, 
+                                              x, y,
                                               &xx, &yy);
       x = floor (xx + 0.5);
       y = floor (yy + 0.5);
     }
-  
+
   *win_x = x;
   *win_y = y;
-  
+
   return window;
 }
 
@@ -545,35 +545,20 @@ gdk_window_real_window_get_pointer (GdkDisplay       *display,
 
   private = (GdkWindowObject *) window;
 
-  pointer_window = _gdk_windowing_window_get_pointer (display,
-                                                      window,
-                                                      &tmpx, &tmpy,
-                                                      mask);
+  _gdk_windowing_window_get_pointer (display,
+                                    window,
+                                    &tmpx, &tmpy,
+                                    mask);
   /* We got the coords on the impl, conver to the window */
   tmpx -= private->abs_x;
   tmpy -= private->abs_y;
-  
+
   if (x)
     *x = tmpx;
   if (y)
     *y = tmpy;
 
-  /* We need to recalculate the true child window with the pointer in it
-     due to possible client side child windows */
-  if (pointer_window != NULL)
-    {
-      /* First get the pointer coords relative to pointer_window */
-      _gdk_windowing_window_get_pointer (display,
-                                        pointer_window,
-                                        &tmpx, &tmpy,
-                                        &tmp_mask);
-      /* Then convert that to a client side window */
-      pointer_window = _gdk_window_find_descendant_at (pointer_window,
-                                                      tmpx, tmpy, 
-                                                      NULL, NULL);
-    }
-
-  return pointer_window;
+  return _gdk_window_find_child_at (window, x, y);
 }
 
 /**
index d3c74cdf840ef09a097e2a9f17b106021cc9bd5e..f1124a3a7f6e2defa3ae48bfa76adaddf9e2b567 100644 (file)
@@ -606,6 +606,8 @@ void _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
 cairo_surface_t * _gdk_windowing_create_cairo_surface (GdkDrawable *drawable,
                                                       int width,
                                                       int height);
+GdkWindow * _gdk_window_find_child_at (GdkWindow *window,
+                                      int x, int y);
 GdkWindow * _gdk_window_find_descendant_at (GdkWindow *toplevel,
                                            double x, double y,
                                            double *found_x,
index 3619a1cb5a51397ba63b25794114910831b3092b..d85c06746fad66588bf380094f9c49f050f01b29 100644 (file)
@@ -7795,6 +7795,38 @@ convert_toplevel_coords_to_window (GdkWindow *window,
   *window_y = y;
 }
 
+GdkWindow *
+_gdk_window_find_child_at (GdkWindow *window,
+                          int x, int y)
+{
+  GdkWindowObject *private, *sub;
+  double child_x, child_y;
+  GList *l;
+
+  private = (GdkWindowObject *)window;
+
+  if (point_in_window (private, x, y))
+    {
+      /* Children is ordered in reverse stack order, i.e. first is topmost */
+      for (l = private->children; l != NULL; l = l->next)
+       {
+         sub = l->data;
+
+         if (!GDK_WINDOW_IS_MAPPED (sub))
+           continue;
+
+         convert_coords_to_child (sub,
+                                  x, y,
+                                  &child_x, &child_y);
+         if (point_in_window (sub, child_x, child_y))
+           return (GdkWindow *)sub;
+       }
+    }
+
+  return NULL;
+}
+
+
 GdkWindow *
 _gdk_window_find_descendant_at (GdkWindow *toplevel,
                                double x, double y,